﻿using Onshi.POS.Modelo.Entidades;
using Onshi.POS.AccesoDatos.Interfaces;
using Onshi.POS.AccesoDatos;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using Onshi.POS.Modelo.Entidades.Tipos;

namespace Onshi.POS.Repositorios
{
    public class RepositorioPerfiles : RepositorioEntidad<Perfil, Int32, IServicioDatosPerfiles>
    {
        #region Constructores

        public RepositorioPerfiles()
            : base()
        {
        }

        #endregion

        #region Atributos

        private RepositorioPermisos repositorioPermisos = new RepositorioPermisos();

        #endregion

        #region Metodos

        public override Perfil DevolverPorId(Int32 id)
        {
            var perfil = entidades.Where(x => x.Id == id).FirstOrDefault();
            if (perfil == null)
                using (var ds = servicioDatos.Perfiles_DevolverPorId(id))
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        perfil = FilaAEntidad(ds.Tables[0].Rows[0]);
                        perfil.Permisos = TablaAListaPermisos(ds.Tables[1]);
                        entidades.Add(perfil);
                    }
            return perfil;
        }

        public List<Perfil> DevolverTodos()
        {
            using (var ds = servicioDatos.Perfiles_DevolverTodos())
            {
                entidades = TablaALista(ds.Tables[0]);
                foreach (var perfil in entidades)
                {
                    var permisos = ds.Tables[1].AsEnumerable().Where(x => (Int32)x["IdPerfil"] == perfil.Id).AsDataView().ToTable();
                    perfil.Permisos = TablaAListaPermisos(permisos);
                }
            }
            return entidades;
        }

        private List<Permiso> TablaAListaPermisos(DataTable tabla)
        {
            var permisos = new List<Permiso>();
            foreach (DataRow item in tabla.Rows)
                permisos.Add(repositorioPermisos.DevolverPorId((Byte)item["IdPermiso"]));
            return permisos;
        }

        protected override Perfil FilaAEntidad(DataRow fila)
        {
            var perfil = new Perfil();
            perfil.Id = (Int32)fila["IdPerfil"];
            perfil.Nombre = (String)fila["Nombre"];
            perfil.Observaciones = (String)fila["Observaciones"];
            return perfil;
        }

        public void Insertar(Perfil perfil)
        {
            perfil.Id = servicioDatos.Perfiles_Insertar(perfil.Nombre, perfil.Observaciones);
        }

        public void Eliminar(Perfil perfil)
        {
            servicioDatos.Perfiles_Eliminar(perfil.Id);
        }

        public void Modificar(Perfil perfil)
        {
            servicioDatos.Perfiles_Modificar(perfil.Id, perfil.Nombre, perfil.Observaciones);
        }

        public void EliminarPermisosPorPerfil(Perfil perfil)
        {
            servicioDatos.PerfilesPermisos_EliminarPorPerfil(perfil.Id);
        }

        public void InsertarPermiso(Perfil perfil, Permiso permiso)
        {
            servicioDatos.PerfilesPermisos_Insertar(perfil.Id, permiso.Id);
        }

        #endregion
    }
}
